<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数据类型总结(data type summary)</title>
  <!-- 
  JavaScript的数据类型可以分为两大类：基本数据类型（原始类型）和引用数据类型。

  一、基本数据类型（Primitive Types）
  基本数据类型是不可变的，存储在栈中，直接包含值。JavaScript中的基本数据类型有：

    1. Undefined:
      - 只有一个值： `undefined` ，表示变量未被赋值。
      let a;
      console.log(a); // undefined
    2. Null:
      - 只有一个值： `null` ，表示“无”或“空”。
      let b = null;
      console.log(b); // null
    3. Boolean:
      - 布尔类型，只有两个值： `true` 和 `false` 。
      let isTrue = true;
      console.log(isTrue); // true
    4. Number:
      - 数字类型，包括整数和浮点数，JavaScript中的数字都是以64位浮点数格式存储。
      let num = 42;
      console.log(num); // 42
    5. String:
      - 字符串类型，用于表示文本，可以用单引号、双引号或反引号包裹。
      let str = "Hello, World!";
      console.log(str); // Hello, World!
    6. Symbol (ES6引入):
      - 用于创建唯一的标识符，通常用于对象属性的键。
      let sym = Symbol('description');
      console.log(sym); // Symbol(description)
    7. BigInt (ES11引入):
      - 用于表示大于 `Number.MAX_SAFE_INTEGER` 的整数。
      let bigInt = BigInt(1234567890123456789012345678901234567890);
      console.log(bigInt); // 1234567890123456789012345678901234567890n
      
  二、引用数据类型（Reference Types）
  引用数据类型是可变的，存储在堆中，变量存储的是对对象的引用。JavaScript中的引用数据类型包括：

    1. Object:
      - 对象是键值对的集合，可以包含多个值和功能。
      let obj = { name: "Alice", age: 25 };
      console.log(obj); // { name: "Alice", age: 25 }
    2. Array:
      - 数组是一种特殊的对象，用于存储有序的值。
      let arr = [1, 2, 3, 4, 5];
      console.log(arr); // [1, 2, 3, 4, 5]
    3. Function:
      - 函数也是一种对象，可以被调用。
      function myFunction() {
        return "Hello!";
      }
      console.log(myFunction()); // Hello!
    4. Date:
      -  `Date` 对象用于处理日期和时间。
      let date = new Date();
      console.log(date); // 当前日期和时间
    5. RegExp:
      - 正则表达式对象，用于匹配字符串模式。
      let regex = /hello/;
      console.log(regex.test("hello world")); // true
    6. Map (ES6引入):
      - 用于存储键值对，键可以是任意类型。
      let map = new Map();
      map.set("name", "Alice");
      console.log(map.get("name")); // Alice
    7. Set (ES6引入):
      - 用于存储唯一值，可以包含多个值。
      let set = new Set();
    8. Error:
      - 用于表示错误和异常。
      let error = new Error("Something went wrong");
      console.log(error.message); // Something went wrong
    
    额外: NaN
    NaN 是一个特殊的数值，表示 "Not-a-Number"（非数字）。它用于表示一个未定义或不可表示的数值。例如，当执行数学运算时，如果结果无法表示为数字，就会返回 NaN。例如：
    let result = 0 / 0;
    console.log(result); // NaN
    NaN 与任何值都不相等，包括它自己。因此，要检查一个值是否为 NaN，可以使用 isNaN() 函数：
    console.log(isNaN(NaN)); // true
    console.log(isNaN(42)); // false
    NaN 通常用于表示无效的数学运算结果，例如除以零或无效的数学表达式。
    
    三、总结

    - 基本数据类型是不可变的，直接存储值。
    - 引用数据类型是可变的，存储对对象的引用。
    - 使用 `typeof` 运算符可以检测变量的数据类型，但在处理对象时要注意其局限性。

    了解这些数据类型有助于更好地理解JavaScript的行为和特性，从而编写出更高效和可维护的代码。
   -->
</head>
<body>
  
  <script>
    // 一.基本数据类型
    // 1.undefined
    let a;
    let info = undefined // 不推荐
    console.log(a); // undefined

    // 2.Null
    let b = null;
    console.log("Null", b, typeof b, !!b); // null object false

    // 3.Boolean
    let c = true;
    console.log("Boolean",c); // true

    // 4.Number
    let d = 123;
    console.log("Number",d); // 123
    let num1 = Infinity;
    let num2 = -Infinity;
    console.log("Number",num1); // Infinity
    console.log("Number",num2); // -Infinity
    let num3 = 100 
    let num4 = 0x100 // 16进制
    let num5 = 0b100 // 2进制
    console.log("Number",num3); // 100
    console.log("Number",num4); // 256

    // 5.string
    let e = "hello";
    console.log("String",e); // hello
    let message = `String ${e} World, ${2 + 4}`
    console.log("String",message); // String hello World, 6
    let message1 = "String 'hello' World, \"hello\""
    console.log("String",message1); // String 'hello' World, "hello"
    let message2 = "String 'hello' World, \\ \'\' \nhello"
    console.log("String",message2); // String 'hello' World, \ ' ' hello

    // 6.symbol
    let f = Symbol("unique");
    console.log("Symbol",f); // Symbol(unique)

    // 7.bigint
    let g = 123n;
    console.log("bigint",g); // 123n


    // 二.引用数据类型
    // 1.Array
    let arr = [1, 2, 3];
    console.log("bigint",arr); // [1, 2, 3]

    // 2.Function
    function myFunction() {
      return "Hello!";
    }
    console.log("bigint",myFunction()); // Hello!

    // 3.Date
    let date = new Date();
    console.log("Date",date); // Mon Jan 01 2024 00:00:00 GMT+0800 (中国标准时间)

    // 4.RegExp
    let regex = /hello/;
    console.log("RegExp",regex); // /hello/

    // 5.Error
    let error = new Error("Something went wrong");
    console.log("Error",error); // Error: Something went wrong

    // 6.Object
    let obj = { name: "Alice", age: 25 };
    console.log("Object",obj, obj.name, obj.age); // { name: 'Alice', age: 25 } Alice 25

    // 7.Set
    let set = new Set([1, 2, 3]);
    console.log("Set",set); // Set { 1, 2, 3 }

    // 8.Map
    let map = new Map([["name", "Alice"], ["age", 25]]);
    console.log("Map",map); // Map { 'name' => 'Alice', 'age' => 25 }

    // NaN - 通常用于表示无效的数学运算结果，例如除以零或无效的数学表达式。
    let result = 0 / 0;
    console.log(result); // NaN
    // NaN 与任何值都不相等，包括它自己。因此，要检查一个值是否为 NaN，可以使用 isNaN() 函数：
    console.log(isNaN(NaN)); // true
    console.log(isNaN(42)); // false

  </script>
  
</body>
</html>